/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op;

import core.CreateConta;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Jônatas
 */
public class CreateContaVivo3 implements CreateConta {

    public static Pattern hora = Pattern.compile("[0-9]{2}:[0-9]{2}:[0-9]{2}");
    public static Pattern meio = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{2} a "
            + "[0-9]{2}/[0-9]{2}/[0-9]{2}");

    public enum TiposVivo3 {

        LIGACAO, INTERNET, SMS, ADICIONAL, CAIXA_POSTAL
    };

    public ContaTelefonica createConta(String[] fullFile) throws Exception {

        Telefone origem = null;
        String tipo = null;
        String operadora = null;

        Boolean aCobrar = false;

        ContaTelefonica contaTelefonica = new ContaTelefonica();

        contaTelefonica.contaMensal = new ArrayList<EntradaAbstrata>();

        for (int i = 0; i < fullFile.length; i++) {
            String line = fullFile[i].trim();

            if (line.isEmpty()) {
                continue;
            }



            if (line.matches("DESCONTOS E PROMO..ES")) {
                i++;
                line = fullFile[++i].trim();
                do {
                    EntradaAbstrata entrada = getDesconto(line);

                    if (entrada != null) {
                        contaTelefonica.contaMensal.add(entrada);
                    }
                    line = fullFile[++i].trim();

                } while (!line.contains("Subtotal"));

                continue;
            }

            if (line.startsWith("VEJA O USO DETALHADO DO VIVO") || line.startsWith("VEJA O USO DO VIVO")) {
                String tokens[] = line.split(" ");

                String fone = tokens[tokens.length - 1];

                if (fone.length() == 12) {
                    origem = new Telefone(fone.substring(0, 2), fone.substring(3, 7), fone.substring(8));
                } else {
                    origem = new Telefone(fone, true);
                }

                continue;

            }

            if (origem == null) {
                continue;
            }

            if (line.matches("Torpedo SMS")) {
                tipo = "Torpedo";
                aCobrar = false;
                continue;
            }

            if (line.startsWith("Internet M") && line.contains("vel")) {
                tipo = line;
                aCobrar = false;
                continue;
            }

            if (line.startsWith("Adicional") && !line.contains("(Continua")) {
                tipo = line;
                continue;
            }

            if (line.matches("Liga..es.*")) {

                if (line.contains("Continua")) {
                    continue;
                }

                if (line.contains("Cobrar")) {
                    aCobrar = true;
                } else {
                    aCobrar = false;
                }

                tipo = line;
                if (fullFile[i - 1].contains("ROAMING")) {
                    if (fullFile[i + 1].contains("OPERADORA")) {
                        operadora = "EM ROAMING" + " - DDD" + " - " + fullFile[++i].substring(9).trim();
                    } else {
                        tipo += " - ROAMING";
                    }
                }

                continue;

            }

            if (line.contains("OPERADORA")) {
                operadora = "DDD" + " - " + line.substring(9).trim();
                continue;
            }

            if (line.startsWith("Para Celulares") || line.startsWith("Para Dentro") || line.startsWith("Para Outros") || line.startsWith("Recebidas")) {
                tipo = operadora + " - " + line;

                if (tipo.contains("(Continua")) {

                    int idx = tipo.indexOf("(Continua");

                    tipo = tipo.substring(0, idx).trim();

                }

                continue;
            }

            if(line.matches("Acesso a Caixa Postal") && !line.contains("(Continua")) {
                tipo = line;
                aCobrar = false;
                continue;
            }

            if (line.matches("Per.odo[ \\t]+Incluso[ \\t]+Plano/Pacote[ \\t]+Utilizado[ \\t]+"
                    + "Minutos/Unidades[ \\t]+Valor[ \\t]+R.[ \\t]+Plano/Pacote")) {

                line = fullFile[++i].trim();

                double valor = getValue(line);

                if (valor == 0.0) {
                    continue;
                }

                Matcher matcher = meio.matcher(line);

                matcher.find();

                String plano = line.substring(0, matcher.start()).trim();

                Map<String, Object> parametersMap = new HashMap<String, Object>();
                parametersMap.put("plano", plano);

                do {

                    parametersMap.put("origem", origem);
                    parametersMap.put("valor", new Double(valor));

                    EntradaAbstrata entrada = QuebraStringVivo3.quebraStringPlano(parametersMap);

                    if (entrada != null) {
                        contaTelefonica.contaMensal.add(entrada);
                    }

                    line = fullFile[++i].trim();

                    valor = getValue(line);

                    matcher = meio.matcher(line);

                } while (matcher.find());

                i--;

                continue;

            }


            Matcher matchData = CreateContaVivo2.data.matcher(line);
            Matcher matchHora = hora.matcher(line);

            // Ligacao ou torpedo ou internet
            if (matchData.find() && matchHora.find()) {
                Map<String, Object> parametersMap = new HashMap<String, Object>();
                parametersMap.put("origem", origem);
                parametersMap.put("data", matchData.group());
                parametersMap.put("hora", matchHora.group());
                parametersMap.put("line", line);
                parametersMap.put("tipo", tipo);
                parametersMap.put("aCobrar", aCobrar);

                if (line.contains("SMS")) {
                    parametersMap.put("TipoVivo3", TiposVivo3.SMS);
                } else if (line.contains("MB") && line.contains("KB")) {
                    parametersMap.put("TipoVivo3", TiposVivo3.INTERNET);
                } else if (tipo.contains("Adicional")) {
                    parametersMap.put("TipoVivo3", TiposVivo3.ADICIONAL);
                } else if (tipo.contains("Acesso a Caixa Postal")) {
                    parametersMap.put("TipoVivo3", TiposVivo3.CAIXA_POSTAL);
                } else {
                    parametersMap.put("TipoVivo3", TiposVivo3.LIGACAO);
                }

                EntradaAbstrata entrada = new QuebraStringVivo3().quebraString(parametersMap);

                if (entrada != null) {
                    contaTelefonica.contaMensal.add(entrada);
                }

            }

        }

        Collections.sort(contaTelefonica.contaMensal, new ComparatorEntradaAbstrataPorTelefone());

        contaTelefonica.contaResumida();

        return contaTelefonica;
    }
    private static Pattern patternValor = Pattern.compile("-?[0-9]+[,][0-9]{2}");

    private double getValue(String line) {
        Matcher matchValor = patternValor.matcher(line);
        if (!matchValor.find()) {
            return 0.0;
        }
        double retorno = 0.0;
        retorno = Double.parseDouble(matchValor.group().replace(",", "."));


        return retorno;
    }

    private EntradaAbstrata getDesconto(String line) throws Exception {

        StringTokenizer tokenizer = new StringTokenizer(line);

        int tam = tokenizer.countTokens();

        String[] tokens = new String[tam];

        for (int i = 0; i < tam; i++) {
            tokens[i] = tokenizer.nextToken();
        }

        String fone = tokens[tam - 2];
        String valor = tokens[tam - 1];

        String plano = "";

        for (int i = 0; i < tam - 2; i++) {
            plano += tokens[i] + " ";
        }

        double custo = 0.0;

        try {
            custo = Double.parseDouble(valor.replace(",", "."));
        } catch (NumberFormatException numberFormatException) {
            return null;
        }

        if (custo == 0.0) {
            return null;
        }

        Telefone origem = null;

        if (fone.length() == 12) {
            origem = new Telefone(fone.substring(0, 2), fone.substring(3, 7), fone.substring(8));
        } else {
            origem = new Telefone(fone, true);
        }

        Map<String, Object> parametersMap = new HashMap<String, Object>();
        parametersMap.put("plano", plano);
        parametersMap.put("origem", origem);
        parametersMap.put("valor", new Double(custo));

        return QuebraStringVivo3.quebraStringPlano(parametersMap);

    }
}
